比較沒接觸過的東西有點難寫,在斷賽邊緣反覆試探
昨天提到,我們無法控制非同步函式回傳的時間,但如果我們要作一連串的操作時,
後面的操作需要前面的回傳資料,這時候需要利用我們回呼(callback)來實作。
用setTimeout()當作例子,我們想要在印出1的一秒後印出2然後一秒後3 然後4 然後5
setTimeout(function () {
console.log(1);
setTimeout(function () {
console.log(2);
setTimeout(function () {
console.log(3);
setTimeout(function () {
console.log(4);
setTimeout(function () {
console.log(5);
}, 1000);
}, 1000);
}, 1000);
}, 1000);
}, 1000);
人的閱讀順序是從上到下的,但這種callback的巢狀結構非常難閱讀,
這種巢狀結構叫做回呼地獄(callback hell) 特色是縮排造成的三角形
另外上面已經是很簡單的例子了,只有5個計時器沒有另外的程式碼
假設今天要使用的是外部API呢?
再來個例子,今天想要作一個代訂外國書的網站,使用者選取書之後要呼叫外部匯率API,
呈現價格確定結帳後呼叫刷卡API,確定扣款成功後在顯示購買成功,
然後為了怕外部API有問題,要確定匯率是否正確的檢查,防止重複扣款,另外還有API無回應時的應對。
全部都用上面那種巢狀回呼來寫。
總結一下callback的問題:
幸好ES6新增了Promise可以有效改善callback的問題,明天最後一篇就來要寫Promise~